package com.seanLab.tool.TagSuggestModel;

import org.ansj.library.DicLibrary;
import org.ansj.library.StopLibrary;
import org.ansj.recognition.impl.StopRecognition;
import org.ansj.util.MyStaticValue;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static com.seanLab.tool.TagSuggestModel.RawInfoType.*;

/**
 * 关键词提取模块中主要参数配置
 */
public class StaticModelProperties {
//    //标注过程中提取关键词的数目
    public static final int NumOfTag = 10;

    //不同来源的权重
    public static final HashMap<RawInfoType, Double> DefaultWeightMap = getDefaultWeight();
    private static HashMap<RawInfoType, Double> getDefaultWeight() {
        HashMap<RawInfoType, Double> weightMap = new HashMap<>();
        weightMap.put(TAG, 0.0);
        weightMap.put(TITLE, 3.0);
        weightMap.put(CONTENT, 1.0);
        weightMap.put(PARA_ABOVE_IMAGE, 1.5);
        weightMap.put(PARA_UNDER_IMAGE, 1.5);
        weightMap.put(DESC_OF_IMAGE, 2.0);
        weightMap.put(SEMANTIC_OF_IMAGE, 0.0);
        return weightMap;
    }

    //公司词典，用于EconomyTextRankKE，对于公司名给予1.5倍的分数
    public static final String[] companyDics = new String[] {"workingDir/dict/das_sogou_comp.dic", "workingDir/dict/das_stocks.dic"};

    static {
        final File dicFolder = new File("workingDir/dict");
        MyStaticValue.putLibrary(DicLibrary.DEFAULT, dicFolder.getPath());
        MyStaticValue.reloadLibrary(DicLibrary.DEFAULT);
        MyStaticValue.putLibrary(StopLibrary.DEFAULT + "_cn", "workingDir/stop/chinese_stop_word.txt");
        MyStaticValue.putLibrary(StopLibrary.DEFAULT + "_en", "workingDir/stop/stopwords_en.txt");
        MyStaticValue.putLibrary(StopLibrary.DEFAULT + "_sina", "workingDir/stop/chinese_stop_word_sina.txt");
        MyStaticValue.reloadLibrary(StopLibrary.DEFAULT + "_cn");
        MyStaticValue.reloadLibrary(StopLibrary.DEFAULT + "_en");
        MyStaticValue.reloadLibrary(StopLibrary.DEFAULT + "_sina");
    }

    public static final StopRecognition DefaultFilter = getDefaultFilter();
    private static List<String> getStopWords() {
        List<String> stopwords = new ArrayList<>();
        try {
            String line = null;
            BufferedReader reader = new BufferedReader(new FileReader("workingDir/stop/chinese_stop_word.txt"));
            while ((line = reader.readLine()) != null) {
                stopwords.add(line);
            }
            reader.close();
            reader = new BufferedReader(new FileReader("workingDir/stop/stopwords_en.txt"));
            while ((line = reader.readLine()) != null) {
                stopwords.add(line);
            }
            reader.close();
            reader = new BufferedReader(new FileReader("workingDir/stop/chinese_stop_word_sina.txt"));
            while ((line = reader.readLine()) != null) {
                stopwords.add(line);
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stopwords;
    }
    private static StopRecognition getDefaultFilter() {
        StopRecognition filter = new StopRecognition();
        filter.insertStopWords(getStopWords());
        filter.insertStopNatures("null");
        filter.insertStopNatures("ag"); //形语素  绿色/n 似/d 锦/Ag
        filter.insertStopNatures("a"); //形容词  [重要/a 步伐/n]NP ，美丽/a ，看似/v 抽象/a
        filter.insertStopNatures("ad"); //副形词  [积极/ad 谋求/v]V-ZZ ，幻象/n 易/ad 逝/Vg
//        filter.insertStopNatures("an"); //名形词  [外交/n 和/c 安全/an]NP-BL
        filter.insertStopNatures("bg"); //区别语素  赤/Ag 橙/Bg 黄/a 绿/a 青/a 蓝/a 紫/a
        filter.insertStopNatures("b"); //区别词  女/b 司机/n， 金/b 手镯/n， 慢性/b 胃炎/n，古/b 钱币/n, 副/b 主任/n， 总/b 公司/n
        filter.insertStopNatures("c"); //连词  合作/vn 与/c 伙伴/n
        filter.insertStopNatures("dg"); //副语素  了解/v 甚/Dg 深/a ，煞/Dg 是/v 喜人/a
        filter.insertStopNatures("d"); //副词  进一步/d 发展/v
        filter.insertStopNatures("e"); //叹词  啊/e ，/w 那/r 金灿灿/z 的/u 麦穗/n
        filter.insertStopNatures("f"); //方位词  军人/n 的/u 眼睛/n 里/f 不/d 是/v 没有/v 风景/n
        filter.insertStopNatures("h"); //前接成分  许多/m 非/h 主角/n 人物/n ,办事处/n 的/u "/w 准/h 政府/n "/w 功能/n 不断/d 加强/v
//        filter.insertStopNatures("i"); //成语  一言一行/i ,义无反顾/i
//        filter.insertStopNatures("j"); //简称略语  [德/j 外长/n]NP ,文教/j
        filter.insertStopNatures("k"); //后接成分  少年儿童/l 朋友/n 们/k ,身体/n 健康/a 者/k
//        filter.insertStopNatures("l"); //习用语  少年儿童/l 朋友/n 们/k ,落到实处/l
        filter.insertStopNatures("mg"); //数语素  甲/Mg 减下/v 的/u 人/n 让/v 乙/Mg 背上/v ,凡/d "/w 寅/Mg 年/n "/w 中/f 出生/v 的/u 人/n 生肖/n 都/d 属/v 虎/n
        filter.insertStopNatures("m"); //数词  1．数量词组应切分为数词和量词。 三/m 个/q, 10/m 公斤/q, 一/m 盒/q 点心/n ,但少数数量词已是词典的登录单位，则不再切分。 一个/m , 一些/m ,2. 基数、序数、小数、分数、百分数一律不予切分，为一个切分单位，标注为 m 。一百二十三/m，20万/m， 123.54/m, 一个/m, 第一/m，第三十五/m， 20%/m， 三分之二/m，千分之三十/m, 几十/m 人/n，十几万/m 元/q， 第一百零一/m 个/q ,3. 约数，前加副词、形容词或后加"来、多、左右"等助数词的应予分开。约/d 一百/m 多/m 万/m，仅/d 一百/m 个/q，四十/m 来/m 个/q，二十/m 余/m 只/q， 十几/m 个/q，三十/m 左右/m ，两个数词相连的及"成百"、"上千"等则不予切分。五六/m 年/q，七八/m 天/q，十七八/m 岁/q， 成百/m 学生/n，上千/m 人/n， 4．表序关系的"数＋名"结构，应予切分。二/m 连/n ，　三/m 部/n
//        filter.insertStopNatures("ng"); //名语素  出/v 过/u 两/m 天/q 差/Ng, 理/v 了/u 一/m 次/q 发/Ng
//        filter.insertStopNatures("n"); //名词  （参见 动词--v）岗位/n , 城市/n , 机会/n ,她/r 是/v 责任/n 编辑/n
//        filter.insertStopNatures("nr"); //人名
//        filter.insertStopNatures("ns"); //地名
//        filter.insertStopNatures("nt"); //机构团体
//        filter.insertStopNatures("nx"); //外文字符  A/nx 公司/n ，B/nx 先生/n ，X/nx 君/Ng ,24/m K/nx 镀金/n ,C/nx 是/v 光速/n ,Windows98/nx ,PentiumIV/nx ,I LOVE THIS GAME/nx
//        filter.insertStopNatures("nz"); //其他专名
        filter.insertStopNatures("o"); //拟声词  哈哈/o 一/m 笑/v ,装载机/n 隆隆/o 推进/v
        filter.insertStopNatures("p"); //介词  对/p 子孙后代/n 负责/v ,以/p 煤/n 养/v 农/Ng ,为/p 治理/v 荒山/n 服务/v , 把/p 青年/n 推/v 上/v 了/u 领导/vn 岗位/n
        filter.insertStopNatures("q"); //量词  参见数词m）首/m 批/q ,一/m 年/q
        filter.insertStopNatures("rg"); //代语素  读者/n 就/d 是/v 这/r 两/m 棵/q 小树/n 扎根/v 于/p 斯/Rg 、/w 成长/v 于/p 斯/Rg 的/u 肥田/n 沃土/n
        filter.insertStopNatures("r"); //代词  单音节代词"本"、"每"、"各"、"诸"后接单音节名词时，和后接的单音节名词合为代词；当后接双音节名词时，应予切分。本报/r， 每人/r， 本社/r， 本/r 地区/n， 各/r 部门/n
//        filter.insertStopNatures("s"); //处所词  家里/s 的/u 电脑/n 都/d 联通/v 了/u 国际/n 互联网/n ,西部/s 交通/n 咽喉/n
        filter.insertStopNatures("tg"); //时语素  ３日/t 晚/Tg 在/p 总统府/n 发表/v 声明/n ,尊重/v 现/Tg 执政/vn 当局/n 的/u 权威/n
        filter.insertStopNatures("t"); //时间词  1. 年月日时分秒，按年、月、日、时、分、秒切分，标注为t 。1997年/t 3月/t 19日/t 下午/t 2时/t 18分/t若数字后无表示时间的"年、月、日、时、分、秒"等的标为数词m。1998/m 中文/n 信息/n 处理/vn 国际/n 会议/n 2. 历史朝代的名称虽然有专有名词的性质，仍标注为t。西周/t， 秦朝/t，东汉/t， 南北朝/t， 清代/t"牛年、虎年"等一律不予切分，标注为：牛年/t,虎年/t, 甲午年/t， 甲午/t 战争/n， 庚子/t 赔款/n, 戊戌/t 变法/n
        filter.insertStopNatures("u"); //助词  [[俄罗斯/ns 和/c 北约/j]NP-BL 之间/f [战略/n 伙伴/n 关系/n]NP 的/u 建立/vn]NP 填平/v 了/u [[欧洲/ns 安全/a 政治/n]NP 的/u 鸿沟/n]NP
        filter.insertStopNatures("vg"); //动语素  洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg
        filter.insertStopNatures("v"); //动词  参见 名词--n）[[[欧盟/j 扩大/v]S 的/u [历史性/n 决定/n]NP]NP 和/c [北约/j 开放/v]S]NP-BL [为/p [创建/v [一/m 种/q 新/a 的/u 欧洲/ns 安全/a 格局/n]NP]VP-SBI]PP-MD [奠定/v 了/u 基础/n]V-SBI
        filter.insertStopNatures("vd"); //副动词  形势/n 会/v 持续/vd 好转/v ,认为/v 是/v 电话局/n 收/v 错/vd 了/u 费/n
//        filter.insertStopNatures("vn"); //名动词  引起/v 人们/n 的/u 关注/vn 和/c 思考/vn ,收费/vn 电话/n 的/u 号码/n
        filter.insertStopNatures("w"); //标点符号
        filter.insertStopNatures("x"); //非语素字
        filter.insertStopNatures("yg"); //语气语素  唯/d 大力/d 者/k 能/v 致/v 之/u 耳/Yg
        filter.insertStopNatures("y"); //语气词  会/v 泄露/v 用户/n 隐私/n 吗/y ,又/d 何在/v 呢/y ？
        filter.insertStopNatures("z"); //状态词  取得/v 扎扎实实/z 的/u 突破性/n 进展/vn ,四季/n 常青/z 的/u 热带/n 树木/n ,短短/z 几/m 年/q 间
//        filter.insertStopNatures(""); //
        return filter;
    }
}
